package intermouse;

import java.util.List;

/**
 * Hangya osztály
 * 
 * @author Sőre András, Demény Fruzsina Gyöngyi
 * @version 1.0
 * @since 2013-03-24
 */
public class Ant extends FieldObject {

	/**
	 * A hátralevő bolyongással töltött körök száma.
	 */
	private int wanderMoves = 0;

	private int count = 8;
	/**
	 * Konstruktor
	 * 
	 * Az Ant osztály konstruktora
	 */
	public Ant() {
		super();
	}

	/**
	 * @param stone
	 *            : a kő, mely rálépne a hangyára
	 * @param isFirst
	 *            : az első meghívása-e a függvénynek
	 * @param direction
	 *            : megadja az irányt
	 * @return megadja a paraméterként kapott kőnek hogy a field mezőre
	 *         léphet-e.
	 */
	boolean canStep(Stone stone, boolean isFirst, int direction) {
		System.out.println(">> FieldObject.canStep(Stone, boolean, int) : bool");
		this.setDead(true);
		System.out.println("<< return");
		return true;
	}

	/**
	 * Meghívódik ha a hangyának sikerült ennie, a wanderMoveshez ad hozzá, és
	 * bolyongani kezd a hangya.
	 */
	public void eats() {
		System.out.println(">> Ant.eats() : void");
		setWanderMoves(16);
		System.out.println("<< return");
	}

	/**
	 * 
	 * A hangyát megtámadta az egyik Malicious objektum, ezért a hangya
	 * FieldObject osztálytól örökölt dead attribútumát beállítjuk, továbbá true
	 * értéket adunk vissza.
	 * 
	 * @return visszaadja, hogy az attack sikeres volt.
	 */
	public boolean attack() {
		System.out.println(">> Ant.attack() : boolean");
		this.setDead(true);
		System.out.println("<< return");
		return true;
	}

	/**
	 * A hangya mozgásáért felelős függvény. Lekérdezi a szomszédos mezőkön
	 * található szagokat, és azok alapján rangsorolja őket, amíg talál egy
	 * olyat amire rá tud lépni a szomszéd mezők közül
	 */
	public void beginRound() {
		System.out.println(">> Ant.beginRound() : void");
		field.addSmell(new AntSmell());
		List<Field> aFields = field.getAdjacentFields();
		boolean flag = true;
		if (getWanderMoves() == 0) {
			while (flag) {
				Field chosenAnt = null;
				int strongestAnt = -1;
				Field chosenFood = null;
				int strongestFood = -1;
				int index = -1;
				for (Field f : aFields) {
					List<Smell> aSmells = f.getSmells();
					for (Smell s : aSmells) {
						if (!s.deodorantReaction())
							if (strongestFood < s.getStrength()) {
								strongestFood = s.getStrength();
								chosenFood = f;
								index = aFields.indexOf(f);
						} else {
							if (strongestAnt < s.getStrength()) {
								strongestAnt = s.getStrength();
								chosenAnt = f;
								index = aFields.indexOf(f);
							}
						}
					}
				}
				if (chosenFood != null) {
					if (chosenFood.canStep(this)) {
						flag = false;
						setField(chosenFood);
					} else {
						aFields.remove(index);
					}
				} else if (chosenAnt != null) {
					if (chosenAnt.canStep(this)) {
						flag = false;
						setField(chosenAnt);
					} else {
						aFields.remove(index);
					}
				} else {
					flag = false;
				}
			}
		} else {
			Field nextField = null;
			while (flag) {
				int tmp = count;
				nextField = aFields.get(tmp%6);
				if (nextField.canStep(this)) {
					setField(nextField);
					flag = false;
				} else {
					aFields.remove(tmp%6);
					tmp++;
				}
			}
			count*=3;
			setWanderMoves(wanderMoves--);
		}
		
		System.out.println("<< return");
	}

	/**
	 * Meghívódik, ha a hangya egy adott mezőre szeretne lépni, meghívja a
	 * megfelelő mező canStep(Ant ant) függvényét.
	 * 
	 * @param a
	 *            hangya referenciája mely rá akar lépni
	 * @return a hangya nem léphet rá másik hangyára
	 */
	public boolean canStep(Ant ant) {
		System.out.println(">> Ant.canStep() : void");
		System.out.println("<< return");
		return false;
	}

	/**
	 * @return Visszaadja a hátralevő bolyongással töltött körök számát.
	 */
	public int getWanderMoves() {
		System.out.println(">> Ant.getWanderMoves() : int");
		System.out.println("<< return");
		return wanderMoves;
	}

	/**
	 * @param mennyi
	 *            legyen a hangya bonyolgással töltött körök száma. Beállítja a
	 *            bolyongással töltött körök számát.
	 */
	public void setWanderMoves(int value) {
		System.out.println(">> Ant.setWanderMoves(int) : void");
		this.wanderMoves = value;
		System.out.println("<< return");
		
	}
}
